node.jsのいろいろなモジュール42 – loadtestでApache ABライクな負荷テスト
nodeで負荷テストを実行する
Apacheは標準で「ab」(Apache Bench) というツールが付属しており、 同時接続数/リクエスト数/URLを指定することで簡単にWEBの性能を測定することができます。
今回紹介するloadtestは、abと同じように指定したURLへの負荷テストを実行します。 また、このloadtestはabと互換性があるよう設計されたオプションも持っています。 コマンドラインから実行することで負荷テストを実行できますし、nodeモジュールとしてAPIを使用して テストをカスタマイズすることもできます。
ではloadtestモジュールをインストールして負荷テストを行ってみましょう。
環境構築方法
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.5
- Node.js : v0.10.8
- npm : 1.2.23
npmを使用してモジュールをグローバルインストールします。
% npm install -g loadtest
負荷テストを実行してみる
loadtestコマンドを実行すれば、負荷テストを実行できます。
% loadtest [-n requests] [-c concurrency] [URL]
URLはhttp/httpsからはじまるURLを指定することができます。 -nオプションはリクエスト数、-cオプションは並行処理数を設定します。
loadtestにはテストサーバが付属しているので、それで負荷テストをローカルで行ってみましょう。 下記のように8000番ポートを指定してテストサーバを起動します。
% testserver 8000
loadtestを実行してみます。リクエスト数は10でやってみましょう。
% loadtest -n 10 http://localhost:8000 [Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO Requests: 0 (0%), requests per second: 0, mean latency: 0 ms [Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO [Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO Completed requests: 10 [Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO Total time: 0.035559 s [Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO Requests per second: 281 [Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO Mean latency: 3.23 ms [Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO [Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO Percentage of the requests served within a certain time [Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO 50% 1 ms [Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO 90% 18 ms [Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO 95% 18 ms [Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO 99% 18 ms [Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO 100% 18 ms (longest request)
リクエストした結果情報がコンソールに表示されます。
また、loadtestをモジュールとしてnodeプログラムから使用することも可能です。 テストサーバが起動した状態で下記プログラムを実行すると、loadtestコマンドを実行した時と同じように負荷テストが実行されます。
//app.js var loadtest = require('loadtest'); var options = { url: 'http://localhost:8000', maxRequests: 10, }; loadtest.loadTest(options, function(error, result) { if (error) { return console.error('Got an error: %s', error); } console.log('Tests run successfully:',result); });
% node app.js Tests run successfully: { totalRequests: 10, totalErrors: ・・・, totalTimeSeconds: ・・・, rps: ・・・, meanLatencyMs: ・・・, percentiles: ・・・, errorCodes: {} }
まとめ
今回はloadtestモジュールの簡単な使用方法について紹介しました。 これ以外にもテスト時にクッキー情報を使用したり、秒ごとに送信するクライアントの数を制御したりできます。 Githubには実行オプション等の詳細情報もありますので、確認してみてください。